/*
 * @(#)UuidGenerator.java Apr 30, 2007
 * 
 * Copyright 2007 by ChinanetCenter Corporation.
 *
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of
 * ChinanetCenter Corporation ("Confidential Information").  You
 * shall not disclose such Confidential Information and shall use
 * it only in accordance with the terms of the license agreement
 * you entered into with ChinanetCenter.
 * 
 */
package com.cnc.fd.util;

import java.net.InetAddress;


/**
 * UUID生成器
 * @author 阿闲
 * @date   Apr 30, 2007
 * @version 1.0
 */
public class UuidGenerator {
	
	private static final int IP;
	 public static int IptoInt( byte[] bytes ) {
	  int result = 0;
	  for (int i=0; i<4; i++) {
	   result = ( result << 8 ) - Byte.MIN_VALUE + (int) bytes[i];
	  }
	  return result;
	 }
	 static {
	  int ipadd;
	  try {
	   ipadd = IptoInt( InetAddress.getLocalHost().getAddress() );
	  }
	  catch (Exception e) {
	   ipadd = 0;
	  }
	  IP = ipadd;
	 }
	 private static short counter = (short) 0;
	 private static final int JVM = (int) ( System.currentTimeMillis() >>> 8 );

	 public UuidGenerator() {
	 }

	 /**
	  * Unique across JVMs on this machine (unless they load this class
	  * in the same quater second - very unlikely)
	  */
	 protected int getJVM() {
	  return JVM;
	 }

	 /**
	  * Unique in a millisecond for this JVM instance (unless there
	  * are > Short.MAX_VALUE instances created in a millisecond)
	  */
	 protected short getCount() {
	  synchronized(UuidGenerator.class) {
	   if (counter<0) counter=0;
	   return counter++;
	  }
	 }

	 /**
	  * Unique in a local network
	  */
	 protected int getIP() {
	  return IP;
	 }

	 /**
	  * Unique down to millisecond
	  */
	 protected short getHiTime() {
	  return (short) ( System.currentTimeMillis() >>> 32 );
	 }
	 protected int getLoTime() {
	  return (int) System.currentTimeMillis();
	 }
	 
	 private final static String sep = "";

	 protected String format(int intval) {
	  String formatted = Integer.toHexString(intval);
	  StringBuffer buf = new StringBuffer("00000000");
	  buf.replace( 8-formatted.length(), 8, formatted );
	  return buf.toString();
	 }

	 protected String format(short shortval) {
	  String formatted = Integer.toHexString(shortval);
	  StringBuffer buf = new StringBuffer("0000");
	  buf.replace( 4-formatted.length(), 4, formatted );
	  return buf.toString();
	 }

	 public String generate() {
	  return new StringBuffer(36)
	   .append( format( getIP() ) ).append(sep)
	   .append( format( getJVM() ) ).append(sep)
	   .append( format( getHiTime() ) ).append(sep)
	   .append( format( getLoTime() ) ).append(sep)
	   .append( format( getCount() ) )
	   .toString();
	 }
	 
	 public static String getUuid(){
		 UuidGenerator ug = new UuidGenerator();
		 return ug.generate();
	 }
	 
	 

}


